package practice;

import java.util.Arrays;
import java.util.Random;

/**
 * 上机题5，问题1
 * 1、随机生成1到100之间的整数1000个
 * 2、统计每个数出现的次数
 * 3、编写方法求出其中出现的最大值（方法头如下）
 * public  static int min(int[] array);
 * 4、使用下面方法头编写方法，消除其中的重复值
 * public static int[] eliminatedDuplicate(int[] lst);
 */

public class ClassTest5_1 {
    public static void main( String[] args ) {
//        //测试数组，使用时需将eliminatedDuplicate方法中的results数组长度修改一下。
//        int[] testarray = { 1, 2, 1, 4, 3, 5 };
//        numberCount(testarray);
//        int maxnum = min(testarray);
//        System.out.println("最大值是：" + maxnum);
//        int[] eliminatedduplicatenumber = eliminatedDuplicate(testarray);
//        System.out.println("消除重复值后的数据为："+Arrays.toString(eliminatedduplicatenumber));

        //获取生成好的1000个整数
        int[] randomnum;
        randomnum = randomNumbers();
        System.out.println("生成的随机数为："+ Arrays.toString(randomnum));

        //打印数字和出现次数
        numberCount(randomnum);

        //打印计算后的最大值
        int maxnum = min(randomnum);
        System.out.println("最大值是：" + maxnum);

        //消除重复值
        int[] eliminatedduplicatenumber = eliminatedDuplicate(randomnum);
        System.out.println("消除重复值后的数据为：" + Arrays.toString(eliminatedduplicatenumber));
    }

    //1、生成1到100之间的整数1000个
    public static int[] randomNumbers() {
        //初始化random和numbers
        Random random = new Random();
        //加上[]代表初始化int类型的数组，不加代表初始化一个int类型的单数字变量
        // int[1000]代表准备好1000个等待写入数字的行
        int[] numbers = new int[1000];
        //循环生成1000次数字
        for ( int i = 0; i < 1000; i++ ) {
            numbers[i]=random.nextInt(100)+1;
        }
        return numbers;
    }

    //2、统计数字出现次数
    public static void numberCount( int[] array ) {
        //依次取出一个数，然后和1000个数字做对比，对比成功后计数器增加1，对比完成后输出结果
        //防止重复统计，增加一个控制开关，若当前数字在前面已经出现过，跳过不统计。
        for ( int i = 0; i < array.length; i++ ) {
            boolean isduplicate = false;
            int count = 0;
            int tmp = array[i];
            for ( int j = 0; j < array.length; j++ ) {
                //i>j，且两数相等，证明该数字已经再前面统计过一次，跳过该次统计。
                if ((tmp == array[j]) && (i > j)) {
                    isduplicate = true;
                    break;
                } else if ((tmp == array[j]) && (i <= j)) {
                    count++;
                }
            }

            if (isduplicate) {
                continue;
            }

            System.out.println("数字：" + tmp + " 出现的次数为：" + count);
        }
    }

    //3、求出现的最大值
    public static int min( int[] array ) {
        boolean islast = false;
        int tmpnumber = 0;
        //从第一个数字开始，将第一个数字和第二个数字比较大小，如果前一个较大，则继续比较第一个数字和第三个数字，类推。
        //如果上一轮比较后，第二个数字较大，则下一轮用第二个数字和第三个数字比较大小，类推
        //每次比较后覆写tmpnumber的值，直到最终结果出现。
        for ( int i = 0; i < array.length - 1; i++ ) {
            for ( int j = i + 1; j < array.length; j++ ) {
                //当右侧数字为最后一个数字时，使用islast来控制本次大小判断为最后一次。
                if (j == array.length - 1) {
                    islast = true;
                }
                if (array[i] > array[j]) {
                    tmpnumber = array[i];
                } else {
                    //若右侧数字较大，需要用j覆写i的值，避免重复比较,但是因为循环结束后i会自增+1，所以需要先-1后再赋值。
                    i = j - 1;
                    tmpnumber = array[j];
                    break;
                }
            }

            if (islast) {
                break;
            }

        }
        return tmpnumber;
    }

    //4、消除重复值
    public static int[] eliminatedDuplicate( int[] lst ) {
        //依次取出一个数字，和该数字前面所有的数字比较，如果该数字一直没出现过，加到results中。如果出现过就跳过本轮对比，也不保存值。
        int[] results = new int[100];
        int index = 0;
        for ( int i = 0; i < lst.length; i++ ) {
            boolean isduplicate = false;
            for ( int j = 0; j < i; j++ ) {
                //如果两次取出的数字一致，证明该数字前面已记录过，跳过本次对比。
                if (lst[i] == lst[j]) {
                    isduplicate = true;
                    break;
                }
            }

            if (!isduplicate) {
                //i中间会跳过导致填入的数字岔开，需要单独计数器每次自增1来确保加进来的数字是按顺序排下去的。
                results[index++] = lst[i];
            }
        }
        return results;
    }

}
